<?php
namespace app\admin\model;
use think\Model;

/******************
 * TP5-坐标查询语句查询
 * $table_key:表名
 * $lng_key:表里的经度字段
 * $lat_key:表里的纬度字段
 * $primary_key://表主键字段
 */
class Coordinate extends Model{
	private $table_key;		//表名
	private $lng_key;		//表里的经度字段
	private $lat_key;		//表里的纬度字段
	private $primary_key;	//表主键字段
	
	//构造函数,获取表配置
	public function __construct($table_key,$lng_key,$lat_key,$primary_key='id'){
		$this->table_key=$table_key;
		$this->lng_key=$lng_key;
		$this->lat_key=$lat_key;
		$this->primary_key=$primary_key;
	}
	
	
	/******************************
	  * 得到查询表坐标的吃查询语句
	  * $lng:用户的经度坐标
	  * $lat:用户的纬度坐标
	  * $range:用户的查询范围(单位米)
	  * return 返回查询主键(id),和范围(distance)单位为米的sql语句
	 */
	public function getsql($lng,$lat,$range='10000000000'){
		//查询范围筛选
		$location = $this->getAround($lat,$lng,$range);
		$wheres=" and ((({$this->lat_key} >= {$location["minLat"]}) and ({$this->lat_key} <= {$location['maxLat']})) and (({$this->lng_key} >= {$location['minLng']}) and ({$this->lng_key} <= {$location['maxLng']})))";
		
		//查询类容筛选
		$field =$this->primary_key.",".$this->distance_sql($lng,$lat,"lng","lat")." as distance";
		$sql = "select {$field} from {$this->table_key} where 1 {$wheres}";
		
		return $sql;
	}
	
	
	/******************************
	 * 得到经纬度的sql查询语句
	 * $lon1:当前用户经度
	 * $lat1:当前用户纬度
	 * $lon2:sql查询的经度字段
	 * $lat2:sql查询的纬度字段
	*/
	private function distance_sql($lon1,$lat1,$lon2,$lat2){
		$sql = "round(6378.138*2*asin(sqrt(pow(sin( ({$lat1}*pi()/180-{$lat2}*pi()/180)/2),2)+cos({$lat1}*pi()/180)*cos({$lat2}*pi()/180)* pow(sin( ({$lon1}*pi()/180-{$lon2}*pi()/180)/2),2)))*1000) ";
		return $sql;
	}
	
	
	/*******************************
	 * 获取某个点的范围坐标
	 * @param  $latitude     纬度
	 * @param  $longitude    经度
	 * @param  $raidus       半径范围(单位：米)
	 * @return multitype:number
	*/
	private function getAround($latitude,$longitude,$raidus='10000000000'){
		$PI = 3.14159265;
		$degree = (24901*1609)/360.0;
		$dpmLat = 1/$degree;
		$radiusLat = $dpmLat*$raidus;
		$minLat = $latitude - $radiusLat;
		$maxLat = $latitude + $radiusLat;
		$mpdLng = $degree*cos($latitude * ($PI/180));
		$dpmLng = 1 / $mpdLng;
		$radiusLng = $dpmLng*$raidus;
		$minLng = $longitude - $radiusLng;
		$maxLng = $longitude + $radiusLng;
		return array ('minLat'=>$minLat, 'maxLat'=>$maxLat, 'minLng'=>$minLng, 'maxLng'=>$maxLng);
	}
	
	
	
}